package cn.fxyz.base.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.Query;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

import cn.fxyz.base.BaseDao;


public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
	// T 在运行时，才可以获得具体的类型
	private Class<?> clazz;

	public BaseDaoImpl() {
		// 获得运行时的类型
		ParameterizedType parameterizedType = (ParameterizedType) this
				.getClass().getGenericSuperclass();
		// 获得实际参数的 ,获得所有。此时获取第一个
		clazz = (Class<?>) parameterizedType.getActualTypeArguments()[0];
	}

	// 查询所有记录
	public List<T> selectAll() {
		return (List<T>) this.getHibernateTemplate().find("from " + clazz.getName());
	}

	// 通过id进行查询
	public T selectById(Serializable id) {

		return (T) this.getHibernateTemplate().get(clazz, id);
	}

	// 修改记录
	public void update(T t) {
		this.getHibernateTemplate().update(t);
	}

	// 插入或修改记录
	public void insertOrUpdate(T t) {
		this.getHibernateTemplate().saveOrUpdate(t);
	}

	// 通过条件查询所有记录
	public List<T> selectAll(String hql, Object[] params) {
		System.out.println("from " + clazz.getName() + " where 1=1 " + hql + params.toString());
		return (List<T>) this.getHibernateTemplate().find(
				"from " + clazz.getName() + " where 1=1 " + hql, params);
	}

	// 插入一条记录
	public void insert(T t) {
		this.getHibernateTemplate().save(t);
	}

	// 删除一条记录
	public void delete(T t) {
		this.getHibernateTemplate().delete(t);
	}

	// 通过条件获取总记录数
	public int getTotalRecord(String hql, Object[] params) {
		String sql = "select count(*) from " + clazz.getName() + " where 1=1 "
				+ hql;
		List<Long> list = (List<Long>) this.getHibernateTemplate().find(sql,
				params);
		return list.get(0).intValue();
	}

	// 通过条件+分页查询数据库记录
	public List<T> selectAll(String hql, Object[] params, int startIndex,
			int pageSize) {
		String sql = "from " + clazz.getName() + " where 1=1 " + hql;
		System.out.println(startIndex);
		System.out.println(pageSize);
		Query queryObject = this.getHibernateTemplate().getSessionFactory()
				.openSession().createQuery(sql);
		// 2 条件设置
		for (int i = 0; i < params.length; i++) {
			queryObject.setParameter(i, params[i]);
		}
		// 3 分页
		queryObject.setFirstResult(startIndex);
		queryObject.setMaxResults(pageSize);
		// 4 查询所有
		return queryObject.list();
	}

}
